spinbutton: Mind the step in the swipe gesture
authorCarlos Garnacho <carlosg@gnome.org>
Tue, 8 Jun 2021 13:09:37 +0000 (15:09 +0200)
committerCarlos Garnacho <carlosg@gnome.org>
Tue, 8 Jun 2021 13:18:14 +0000 (15:18 +0200)
The swipe gesture forces values in the spin button that are
"impossible" according to the adjustment. This can break things
in creative ways.

Ensure the steps provided are always multiples of the adjustment
step value, and keep the remainder for further interaction.

gtk/gtkspinbutton.c

index 303a080e7275dfe9231dc015f1c844ac452a509d..4e70bc56d700fcc0db53cea17fc9b97c4b5f3f32 100644 (file)
@@ -208,6 +208,7 @@ struct _GtkSpinButton
 
   double         climb_rate;
   double         timer_step;
+  double         swipe_remainder;
 
   int            width_chars;
 
@@ -838,6 +839,7 @@ swipe_gesture_begin (GtkGesture       *gesture,
 {
   gtk_gesture_set_state (gesture, GTK_EVENT_SEQUENCE_CLAIMED);
   gtk_widget_grab_focus (GTK_WIDGET (spin_button));
+  spin_button->swipe_remainder = 0;
 }
 
 static void
@@ -845,10 +847,12 @@ swipe_gesture_update (GtkGesture       *gesture,
                       GdkEventSequence *sequence,
                       GtkSpinButton    *spin_button)
 {
-  double vel_y;
+  double vel_y, step;
 
   gtk_gesture_swipe_get_velocity (GTK_GESTURE_SWIPE (gesture), NULL, &vel_y);
-  gtk_spin_button_real_spin (spin_button, -vel_y / 20);
+  step = (-vel_y / 20) + spin_button->swipe_remainder;
+  spin_button->swipe_remainder = fmod (step, gtk_adjustment_get_step_increment (spin_button->adjustment));
+  gtk_spin_button_real_spin (spin_button, step - spin_button->swipe_remainder);
 }
 
 static gboolean